import type { CAC } from 'cac';
import { execa } from 'execa';
import path from 'path';
import fs from 'fs/promises';

// 获取本地命令路径（自动支持 Windows/Linux）
function localBin(cmd: string) {
    const ext = process.platform === 'win32' ? '.CMD' : '';
    return path.join(process.cwd(), 'node_modules', '.bin', `${cmd}${ext}`);
}

async function run() {
    const entries = [
        { dir: 'services', name: 'services' },
        { dir: 'utils', name: 'utils' }
    ];

    const destDir = path.join(process.cwd(), 'apps', 'garden', 'publish', 'dts');
    await fs.mkdir(destDir, { recursive: true });

    for (const e of entries) {
        const cwd = path.join(process.cwd(), e.dir);

        // 清理 types
        await fs.rm(path.join(cwd, 'types'), { recursive: true, force: true });

        // 编译 tsc（使用本地 tsc）
        await execa(localBin('tsc'), { cwd, stdio: 'inherit' });

        // 打包 d.ts（使用本地 dts-bundle）
        await execa(localBin('dts-bundle'), [
            '--name', e.name,
            '--baseDir', './',
            '--main', 'types/index.d.ts',
            '--out', `${e.name}.d.ts`
        ], { cwd, stdio: 'inherit' });

        // 再次清理 types
        await fs.rm(path.join(cwd, 'types'), { recursive: true, force: true });

        // 移动生成的 d.ts 文件到目标目录
        const src = path.join(cwd, `${e.name}.d.ts`);
        const dest = path.join(destDir, `${e.name}.d.ts`);
        await fs.rename(src, dest);
    }
}

export function defineDtsCommand(cac: CAC) {
    cac.command('dts').usage('生成 services 和 utils 的 DTS 声明文件。').action(run);
}
